/**************************************************************************************************
**                                                                                               **
**  文件名称:  nft_stream.c                                                                      **
**  版权所有:  CopyRight @ Xiamen Yaxon NetWork CO.LTD. 2017                                     **
**  文件描述:  数据流管理功能抽象化                                                              **
**  ===========================================================================================  **
**  创建信息:  | 2017-3-20 | LEON | 创建本模块                                                   **
**  ===========================================================================================  **
**  修改信息:  单击此处添加....                                                                  **
**************************************************************************************************/
#include "nft_include.h"
#include "nft_stream.h"

/*************************************************************************************************/
/*                           模块静态变量定义                                                    */
/*************************************************************************************************/
static INT8U          s_tempbuf[512];
static STREAM_T       s_wstrm;

/**************************************************************************************************
**  函数名称:  STRM_InitStream
**  功能描述:  初始化数据流
**  输入参数:  sp: 数据流; bp: 数据流所管理内存地址; maxlen: 数据流所管理内存字节数
**  输出参数:  无
**  返回参数:  成功或失败
**************************************************************************************************/
BOOLEAN STRM_InitStream(STREAM_T *sp, void *bp, INT32U maxlen)
{
    if (sp == 0) {
        return FALSE;
    }
	
    sp->len      = 0;
    sp->maxlen   = maxlen;
    sp->curptr   = bp;
    sp->startptr = bp;
    
    return TRUE;
}

/**************************************************************************************************
**  函数名称:  STRM_GetLeftLen
**  功能描述:  获取数据流中剩余的可用字节数
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  数据流剩余的可用字节数
**************************************************************************************************/
INT32U STRM_GetLeftLen(STREAM_T *sp)
{
    if (sp->maxlen >= sp->len) {
        return (sp->maxlen - sp->len);
    } else {
        return 0;
    }
}

/**************************************************************************************************
**  函数名称:  STRM_GetUsedLen
**  功能描述:  获取数据流中已用字节数
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  数据流已用字节数
**************************************************************************************************/
INT32U STRM_GetUsedLen(STREAM_T *sp)
{
    return (sp->len);
}

/**************************************************************************************************
**  函数名称:  STRM_GetMaxLen
**  功能描述:  获取数据流缓存总长度
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  数据流的最大长度
**************************************************************************************************/
INT32U STRM_GetMaxLen(STREAM_T *sp)
{
    return (sp->maxlen);
}

/**************************************************************************************************
**  函数名称:  STRM_GetCurPtr
**  功能描述:  获取数据流当前读/写指针
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  当前读/写指针
**************************************************************************************************/
void *STRM_GetCurPtr(STREAM_T *sp)
{
    return (sp->curptr);
}

/**************************************************************************************************
**  函数名称:  STRM_GetStartPtr
**  功能描述:  获取数据流所管理内存的地址
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  所管理内存地址
**************************************************************************************************/
void *STRM_GetStartPtr(STREAM_T *sp)
{
    return (sp->startptr);
}

/**************************************************************************************************
**  函数名称:  STRM_MovCurPtr
**  功能描述:  移动数据流中读/写指针
**  输入参数:  sp: 数据流; len: 移动字节数
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_MovCurPtr(STREAM_T *sp, INT32U len)
{
    if (sp != 0) {
        if ((sp->len + len) <= sp->maxlen) {
            sp->len    += len;
            sp->curptr += len;
        } else {
            sp->len = sp->maxlen;
        }
    }
}

/**************************************************************************************************
**  函数名称:  STRM_WriteByte
**  功能描述:  往数据流中写入一个字节数据
**  输入参数:  sp: 数据流; data: 写入的数据
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_WriteByte(STREAM_T *sp, INT8U data)
{
    if (sp != 0){
        if (sp->len < sp->maxlen) {
            *sp->curptr++ = data;
            sp->len++;
        }
    }
}

/**************************************************************************************************
**  函数名称:  STRM_WriteHWord_BE
**  功能描述:  往数据流中写入一个半字(16位)数据【大端模式(高字节先写，低字节后写)】
**  输入参数:  sp: 数据流; writeword: 写入的数据
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_WriteHWord_BE(STREAM_T *sp, INT16U data)
{
    STRM_WriteByte(sp, data >> 8);
    STRM_WriteByte(sp, data);
}

/**************************************************************************************************
**  函数名称:  STRM_WriteHWord_LE
**  功能描述:  往数据流中写入一个半字(16位)数据【小端模式(低字节先写，高字节后写)】
**  输入参数:  sp: 数据流; writeword: 写入的数据
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_WriteHWord_LE(STREAM_T *sp, INT16U writeword)
{
    STRM_WriteByte(sp, writeword);
    STRM_WriteByte(sp, writeword >> 8);
}

/**************************************************************************************************
**  函数名称:  STRM_WriteWord_BE
**  功能描述:  往数据流中写入一个字(32位)数据【大端模式(高字节先写，低字节后写)】
**  输入参数:  sp: 数据流; data: 写入的数据
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_WriteWord_BE(STREAM_T *sp, INT32U data)
{
    STRM_WriteByte(sp, data >> 24);
    STRM_WriteByte(sp, data >> 16);
    STRM_WriteByte(sp, data >> 8);
    STRM_WriteByte(sp, data);
}

/**************************************************************************************************
**  函数名称:  STRM_WriteWord_LE
**  功能描述:  往数据流中写入一个字(32位)数据【小端模式(低字节先写，高字节后写)】
**  输入参数:  sp: 数据流; writeword: 写入的数据
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_WriteWord_LE(STREAM_T *sp, INT32U data)
{
    STRM_WriteByte(sp, data);
    STRM_WriteByte(sp, data >> 8);
    STRM_WriteByte(sp, data >> 16);
    STRM_WriteByte(sp, data >> 24);
}

/**************************************************************************************************
**  函数名称:  STRM_WriteString
**  功能描述:  往数据流中写入字符串
**  输入参数:  sp: 数据流; ptr: 写入的字符串指针
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_WriteString(STREAM_T *sp, char *sptr)
{
    while (*sptr) {
        STRM_WriteByte(sp, *sptr++);
    }
}

/**************************************************************************************************
**  函数名称:  STRM_WriteBlock
**  功能描述:  往数据流中写入一块内存数据
**  输入参数:  sp: 数据流; ptr: 写入的字符串指针; len:  写入的数据块字节数
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_WriteBlock(STREAM_T *sp, INT8U *ptr, INT32U len)
{
    while (len--) {
        STRM_WriteByte(sp, *ptr++);
    }
}

/**************************************************************************************************
**  函数名称:  STRM_ReadByte
**  功能描述:  从数据流中读取一个字节
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  读取到的字节
**************************************************************************************************/
INT8U STRM_ReadByte(STREAM_T *sp)
{
    sp->len++;
    
    return (*sp->curptr++);
}

/**************************************************************************************************
**  函数名称:  STRM_ReadHWord_BE
**  功能描述:  从数据流中读取一个半字(16位)数据【大端模式(先读为高字节，后读为低字节)】
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  读取到的字
**************************************************************************************************/
INT16U STRM_ReadHWord_BE(STREAM_T *sp)
{
    INT16U temp;
	
    temp  = (STRM_ReadByte(sp) << 8);
    temp += STRM_ReadByte(sp);
    
    return temp;
}

/**************************************************************************************************
**  函数名称:  STRM_ReadHWord_LE
**  功能描述:  从数据流中读取一个半字(16位)数据【小端模式(先读为低字节，后读为高字节)】
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  读取到的字
**************************************************************************************************/
INT16U STRM_ReadHWord_LE(STREAM_T *sp)
{
    INT16U temp;
	
	temp  = STRM_ReadByte(sp);
    temp += (STRM_ReadByte(sp) << 8);

    return temp;
}

/**************************************************************************************************
**  函数名称:  STRM_ReadWord_BE
**  功能描述:  从数据流中读取一个半字(32位)数据【大端模式(先读为高字节，后读为低字节)】
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  读取到的字
**************************************************************************************************/
INT32U STRM_ReadWord_BE(STREAM_T *sp)
{
    INT32U temp;
	
    temp  = (STRM_ReadByte(sp) << 24);
    temp += (STRM_ReadByte(sp) << 16);
    temp += (STRM_ReadByte(sp) << 8);
    temp += STRM_ReadByte(sp);
    
    return temp;
}

/**************************************************************************************************
**  函数名称:  STRM_ReadWord_LE
**  功能描述:  从数据流中读取一个半字(32位)数据【小端模式(先读为低字节，后读为高字节)】
**  输入参数:  sp: 数据流
**  输出参数:  无
**  返回参数:  读取到的字
**************************************************************************************************/
INT32U STRM_ReadWord_LE(STREAM_T *sp)
{
    INT32U temp;
    
    temp  = STRM_ReadByte(sp);
    temp += (STRM_ReadByte(sp) << 8);
    temp += (STRM_ReadByte(sp) << 16);
    temp += (STRM_ReadByte(sp) << 24);
    
    return temp;
}

/**************************************************************************************************
**  函数名称:  STRM_ReadBlock
**  功能描述:  从数据流中读取指定长度的数据内容
**  输入参数:  sp: 数据流; ptr: 读取到的数据存放的内存地址; len: 读取的数据长度
**  输出参数:  无
**  返回参数:  无
**************************************************************************************************/
void STRM_ReadBlock(STREAM_T *sp, INT8U *ptr, INT32U len)
{
    while (len--) {
        *ptr++ = STRM_ReadByte(sp);
    }
}

/**************************************************************************************************
**  函数名称:  STRM_GetUserBuffer
**  功能描述:  获取流缓存内存地址
**  输入参数:  无
**  输出参数:  无
**  返回参数:  无
**  特殊说明:  本接口用于需要暂时需要缓存地方，如各类外设组帧发送，注意不要冲突使用
**************************************************************************************************/
STREAM_T *STRM_GetUserBuffer(void)
{
    STRM_InitStream(&s_wstrm, s_tempbuf, sizeof(s_tempbuf));
    return &s_wstrm;
}

